//
// Created by Fan Xing on 2022/3/17.
//

#ifndef HPA_MAP_BASE_H
#define HPA_MAP_BASE_H

#include <string>
#include <opencv2/opencv.hpp>

class MapBase{ //前右下坐标系
protected: //基类的构造函数只能被派生类访问，所以也就不能直接构造基类

    MapBase(){};
    virtual ~MapBase() = default;

    MapBase(const MapBase &m) = delete;
    MapBase& operator=(const MapBase &m) = delete;

public:
    /**
     * 添加点，改变地图网格的状态
     * @param x 世界坐标系
     * @param y
     * @param occupied 网格是被占用还是空
     * @return
     */
    virtual bool AddPoint(const double& x, const double& y) = 0;

    /**
     * 获得一个点对应的状态：0空，1占用
     * @param x
     * @param y
     * @return
     */
    virtual uint8_t GetValue(const double& x, const double& y) = 0;

    /**
     * 保存地图到硬盘
     * @param save_path 路径如果不为空，其结尾应为‘/’
     * @param save_type
     * @return
     */
    virtual bool SaveMap(const std::string& save_path,  const std::string& save_type) = 0;

    /**
     * 加载硬盘的地图文件
     * @param load_path
     * @param load_type
     * @return
     */
    virtual bool LoadMap(const std::string& load_path,  const std::string& load_type) = 0;

    /**
     * 清空地图数据，但是参数不变
     */
    virtual void Clear() = 0;

    /**
     * 获取cv::Mat形式的地图，主要用于可视化
     * @param m
     * @return
     */
    virtual bool toCVMat(cv::Mat &m) = 0;

    //以下几个函数返回地图参数
    virtual double Center_x() = 0;
    virtual double Center_y() = 0;
    virtual double Center_yaw() = 0;
    virtual double Dim_x() = 0;
    virtual double Dim_y() = 0;
    virtual int LayerID() = 0;
};

#endif //HPA_MAP_BASE_H
